package net;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

//这个类来描述服务器对象
public class UdpEchoService {
    //调用操作系统提供的UdpSocket api
    private DatagramSocket socket;//将socket理解成网卡

    //构造方法指定你解析出来的传输层数据需要传给那个端口
    public UdpEchoService(int port) throws SocketException {
        //再此处开启网卡
        socket = new DatagramSocket(port);
    }
    public void start() throws IOException {
        System.out.println("开启服务器");
        //循环的获取客户的请求
        while (true) {
            //1.接收并解析请求
            //此处的DatagramPacket对象是UDP传输层数据包,使用一个字节数组来装载荷
            DatagramPacket requestPacket = new DatagramPacket(new byte[4024], 4024);
            //获取到请求数据包
            //客户端没有发送请求过来, 这里得receive是会阻塞的
            socket.receive(requestPacket);
            //将字节数组转化成字符串
            String request = new String(requestPacket.getData(), 0, requestPacket.getLength());
            //2.处理请求
            String response = process(request);
            //3.返回响应
            //通过getSocketAddress()来获取到发送请求的源端口ip来作为这里得响应的目标ip和端口
            //注意这里不能使用response.length()因为这个获得的是字符的长度, 而我们需要的是字节的长度, 两者可不敢混淆
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(), response.getBytes().length, requestPacket.getAddress(), requestPacket.getPort());
            System.out.printf("服务器收到 %s, 发送响应 %s\n", request, response);
            socket.send(responsePacket);
        }
    }

    private String process(String request) {
        //由于我们这里是回显服务器，所以直接返回请求
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoService service = new UdpEchoService(9090);
        service.start();
    }
}
